package com.jiangyg.mall.core.utils;

import com.jiangyg.mall.core.exception.I18nException;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.ResourceBundle;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 类描述：国际化语言
 *
 * @author jiangyg
 * @version 2.0
 * @date 2020-04-19
 */
public final class I18n {

    /**
     * 国际化资源映射
     */
    private static final Map<String, ResourceBundle> I18N_RESOURCE_MAP = new ConcurrentHashMap<>(3);

    /**
     * 默认国际化文件
     */
    private static final String MESSAGE = "message";

    static {
        // 初始化默认的message国际化资源
        I18N_RESOURCE_MAP.putIfAbsent(MESSAGE, ResourceBundle.getBundle("i18n/message", Locale.getDefault()));
    }

    private I18n() {

    }

    /**
     * 功能描述：修改全局默认本地化且同步国际化资源
     *
     * @param locale 本地化
     */
    public static synchronized void setLocale(Locale locale) {
        // 判断本地化是否变化
        if (locale == Locale.getDefault()) {
            return;
        }
        // 设置全局默认
        Locale.setDefault(locale);
        // 修改国际化资源
        for (Entry<String, ResourceBundle> entry : I18N_RESOURCE_MAP.entrySet()) {
            String key = entry.getKey();
            ResourceBundle resource = entry.getValue();
            String baseName = resource.getBaseBundleName();
            I18N_RESOURCE_MAP.put(key, ResourceBundle.getBundle(baseName, Locale.getDefault()));
        }
    }

    /**
     * 功能描述：获取默认国际化内容
     *
     * @param key 国际化key
     * @return 返回国际化语言
     */
    public static String getString(String key) {
        ResourceBundle resource = obtainResource(MESSAGE);
        if (resource == null) {
            return null;
        }
        return resource.getString(key);
    }

    /**
     * 功能描述：获取默认国际化内容
     *
     * @param key    国际化key
     * @param params 格式化参数
     * @return 返回经过替换的国际化内容，参数替换规则：字符串中的{0},{1},{2}代表格式化参数的索引
     */
    public static String getString(String key, Object... params) {
        ResourceBundle resource = obtainResource(MESSAGE);
        if (resource == null) {
            return null;
        }
        return MessageFormat.format(resource.getString(key), params);
    }

    /**
     * 功能描述：获取默认国际化内容
     *
     * @param name 国际化名称
     * @param key  国际化key
     * @return 返回国际化语言
     */
    public static String getStringByName(String name, String key) {
        ResourceBundle resource = obtainResource(name);
        if (resource == null) {
            return null;
        }
        return resource.getString(key);
    }

    /**
     * 功能描述：获取默认国际化内容
     *
     * @param name   国际化名称
     * @param key    国际化key
     * @param params 格式化参数
     * @return 返回经过替换的国际化内容，参数替换规则：字符串中的{0},{1},{2}代表格式化参数的索引
     */
    public static String getStringByName(String name, String key, Object... params) {
        ResourceBundle resource = obtainResource(name);
        if (resource == null) {
            return null;
        }
        return MessageFormat.format(resource.getString(key), params);
    }

    /**
     * 功能描述：新增国际化资源信息
     *
     * @param name     国际化名称
     * @param baseName 国际化资源路径
     */
    public synchronized static void addResource(String name, String baseName) {
        if (I18N_RESOURCE_MAP.containsKey(name)) {
            throw new I18nException(getStringByName("already.exists.i18n", name));
        }
        I18N_RESOURCE_MAP.putIfAbsent(name, ResourceBundle.getBundle(baseName, Locale.getDefault()));
    }

    /**
     * 功能描述：根据名称获取国际化资源
     *
     * @param name 名称
     * @return 返回国际化资源
     */
    public static ResourceBundle obtainResource(String name) {
        return I18N_RESOURCE_MAP.get(name);
    }

}
